AWS Step Functionsの実行時パラメーターにデフォルト値を設定する
こんにちは。サービス開発室の武田です。
AWS Step Functionsのステートマシンを実行する際、入力として値を渡せます。
さてプログラムのAPIやRESTful APIなど、引数を取るものはデフォルト値が設定されているものが多くあります。やはりステートマシンの実行でもデフォルト値、欲しいですよね?なんとかして実現しましょう。
やり方はいくつかありそうです。(他にもあるかもですが)候補は次の3つ。
- Lambda関数でデフォルト値をセットするロジックを実装する
Choice
ステートを使用して、値がなかった場合にセットするステートマシンを構築するStates.JsonMerge
関数を使用して、デフォルト値をセットするステートマシンを構築する
この中で3が実装コスト、シンプルさともに優れていそうです。そんなわけでやってみました。
States.JsonMerge関数とは
実装の前に、件の関数について知っておきましょう。States.JsonMerge
関数は、JSONデータを2つ引数に取り、それらをマージする関数です。引数は3つです。
States.JsonMerge(json1, json2, deepmerge_mode)
json1
にjson2
を被せるようなイメージです。つまり同名のキーが存在した場合、json2
のデータが残ります。第3引数はデータがJSONの場合の挙動を指定します(ディープマージモード)。現状(2023-09-26時点)ではシャローマージしかサポートしていないため、指定は常にfalse
です。
やってみた
それでは実際にステートマシンを構築して、動作確認をしてみましょう。実行の入力のうち、region
とservice
については次のようにデフォルト値を設けたいとします。
- region: ap-northeast-1
- service: stepfunctions
今回組んだステートマシンは次のようなものです。
{ "Comment": "A description of my state machine", "StartAt": "Define Default Parameter", "States": { "Define Default Parameter": { "Type": "Pass", "Next": "Merge Parameter", "Result": { "region": "ap-northeast-1", "service": "stepfunctions" } }, "Merge Parameter": { "Type": "Pass", "Next": "Success", "Parameters": { "args.$": "States.JsonMerge($, $$.Execution.Input, false)" }, "OutputPath": "$.args" }, "Success": { "Type": "Succeed" } } }
グラフィカルに表示させたものが次のものです。
このように、Pass
ステートだけで実現できるのがポイントですね。分岐などもなくシンプルです。
Define Default Parameter
のResult
でデフォルト値を定義しています。これが次のステートの入力になります。
続くMerge Parameter
のParameters
で、先ほどの値と$$.Execution.Input
をマージしています。$$.Execution.Input
とは、このステートマシン実行の入力です。マージした値を一度args
というキーに設定し、その後OutputPath
で取り出しています。
最後のSucceed
は確認用で、特に意味はありません。
それでは動作確認してみましょう。
region
とservice
を指定した場合。
region
だけ指定した場合。
service
だけ指定した場合。
どちらも省略した場合。
うまく動いてますね!
まとめ
ステートマシンを実行する際の入力について、デフォルト値を設定したい時の方法を試してみました。Pass
ステートを追加するだけで実現できますので、ぜひ試してみてください。